import argparse
import pathway as pw

# 导入各个ETL处理模块
from application.etl.info_to_nsfc_etl_pandas import InfoToNsfcPandas
from application.etl.nsfc_to_es_etl_pandas import NsfcToEsEtlPandas
from application.etl.nsfc_to_kafka_etl import NsfcToKafkaEtl
# 如果存在NsfcToKafkaEtl模块，需要导入
# from application.etl.nsfc_to_kafka_etl import NsfcToKafkaEtl

from application.utils import get_logger

# 设置Pathway许可证
pw.set_license_key("3D373B-5CC3D1-75BAD5-D99A49-C3EFD9-V3")

# 创建日志记录器
logger = get_logger(__name__)


def run(service_name: str):
    """
    根据传入的服务名称运行对应的ETL服务

    :param service_name: 服务名称，可选值：
                         - "info_to_kafka"       : 爬虫抓取的数据 -> Kafka
                         - "info_to_nsfc_pandas" : 资讯数据库 -> 国自然基金数据库（Pandas实现）
                         - "nsfc_to_es_pandas"   : 国自然基金数据库 -> Elasticsearch（Pandas实现）
    """
    match service_name:

        case "nsfc_to_kafka":
            # 注意：请确保 NsfcToKafkaEtl 已定义并正确导入
            info_to_kafka = NsfcToKafkaEtl()
            info_to_kafka.run()

        case "info_to_nsfc_pandas":
            info_to_nsfc_pandas = InfoToNsfcPandas()
            info_to_nsfc_pandas.run()

        case "nsfc_to_es_pandas":
            nsfc_to_es_pandas = NsfcToEsEtlPandas()
            nsfc_to_es_pandas.run()

        case _:
            logger.error(f"无效的服务名称: {service_name}")
            raise ValueError(f"无效的服务名称: {service_name}")


if __name__ == '__main__':
    """
    程序入口：通过命令行参数启动对应ETL任务

    使用示例：
        python -m application.batch_run --service nsfc_to_kafka
        python -m application.batch_run --service info_to_nsfc_pandas
        python -m application.batch_run --service nsfc_to_es_pandas
    """
    parser = argparse.ArgumentParser(
        description="启动指定的ETL服务。可选服务包括 info_to_kafka, info_to_nsfc_pandas, nsfc_to_es_pandas"
    )
    parser.add_argument(
        '--service',
        required=True,
        choices=['nsfc_to_kafka', 'info_to_nsfc_pandas', 'nsfc_to_es_pandas'],
        help='要运行的ETL服务名称'
    )
    args = parser.parse_args()

    logger.info(f"启动服务: {args.service}")
    run(args.service)

    # 启动Pathway
    pw.run(monitoring_level=pw.MonitoringLevel.NONE)
